package org.szy.plugin.gen.controller;

import com.mybatisflex.core.paginate.Page;
import org.noear.solon.annotation.*;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.validation.annotation.NotBlank;
import org.szy.core.common.controller.BaseController;
import org.szy.core.common.entity.R;
import org.szy.core.common.exception.BaseException;
import org.szy.plugin.gen.entity.GenBasic;
import org.szy.plugin.gen.param.GenBasicQueryParam;
import org.szy.plugin.gen.result.GenBasicTableColumnResult;
import org.szy.plugin.gen.result.GenBasicTableResult;
import org.szy.plugin.gen.service.GenBasicService;

import java.io.IOException;
import java.util.List;

/**
 * 生成基础 控制层。
 *
 * @author sunzhiyang
 * @since 2023-06-14
 */
@Controller
@Mapping("gen/basic")
public class GenBasicController extends BaseController<GenBasic> {

    private final String PATH_PREFIX = "gen/basic/";
    @Inject
    private GenBasicService genBasicService;

    /**
     * api代码生成器页面
     */
    @Mapping("/index")
    public ModelAndView index() {
        return new ModelAndView(PATH_PREFIX + "index");
    }

    /**
     * 编辑页面
     */
    @Mapping("/edit")
    public ModelAndView edit() {
        return new ModelAndView(PATH_PREFIX + "edit");
    }

    /**
     * 生成基础实体类信息
     *
     * @param id 标识
     */
    @Get
    @Mapping("/getInfo")
    public R<?> getInfo(@NotBlank String id) {
        GenBasic basic = genBasicService.getById(id);
        return R.asNull(basic);
    }

    /**
     * 获取基础实体类列表
     *
     * @param param 查询参数
     * @return 基础实体类分页列表
     */
    @Get
    @Mapping("/page")
    public R<?> page(GenBasicQueryParam param) {
        Page<GenBasic> page = genBasicService.pageQuery(getPage(), param);
        return R.data(page);
    }

    /**
     * 保存基础实体类信息
     *
     * @param entity 实体类对象
     * @return 保存结果
     */
    @Post
    @Mapping("/add")
    public R<?> add(GenBasic entity) {
        boolean save = genBasicService.add(entity);
        return R.bool(save);
    }

    /**
     * 更新基础实体类信息
     *
     * @param entity 实体类对象
     * @return 保存结果
     */
    @Put
    @Mapping("/update")
    public R<?> update(GenBasic entity) {
        boolean save = genBasicService.updateById(entity);
        return R.bool(save);
    }

    /**
     * 删除基础实体类并删除配置类
     */
    @Delete
    @Mapping("/delete")
    public R<?> delete(@NotBlank String id) {
        boolean remove = genBasicService.removeById(id);
        return R.bool(remove, "删除成功", "删除失败，数据可能正在使用或已删除");
    }

    /**
     * 获取所有表信息
     *
     * @return 表名称和表说明
     */
    @Get
    @Mapping("/tables")
    public R<?> dbsTable() {
        List<GenBasicTableResult> tables = genBasicService.tables();
        return R.data(tables);
    }

    /**
     * 获取表内所有字段信息
     *
     * @param dbTable 数据库表
     * @return 字段列表
     */
    @Get
    @Mapping("/tableColumns")
    public R<?> tableColumns(@NotBlank("表名称不能为空") String dbTable) {
        List<GenBasicTableColumnResult> tables = genBasicService.tableColumns(dbTable);
        return R.data(tables);
    }

    /**
     * 创建表生成配置
     *
     * @param id 主键id
     * @return 生成配置
     */
    @Put
    @Mapping("/createConfig")
    public R<?> createConfig(@NotBlank("基础主键不能为空") String id) {
        boolean exec = genBasicService.createConfig(id);
        return R.bool(exec);
    }


    /**
     * 执行代码生成（压缩包）
     */
//    @Get
    @Mapping("/execGenZip/{id}")
    public void execGenZip(Long id) {
        try {
            genBasicService.execGenZip(id);
        } catch (IOException e) {
            e.printStackTrace();
            throw new BaseException(e.getMessage());
        }
    }

    @Get
    @Mapping("/execGenPro/{id}")
    public R<?> execGenPro(Long id) {
        boolean flag = false;
        try {
            flag = genBasicService.execGenPro(id);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.bool(flag);
    }


}
